iT邦幫忙

2026 iThome 鐵人賽

DAY 3
0
Software Development

30天刷完leetcoode75系列 第 3

C++ 演算法練習 Day3|238, 334, 443 題解與思路分享

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20260917/20184265HcXJ3xLRK9.png

題目解析:現在有一個陣列nums,要求輸出一個新的陣列,每個位置的值是除了自己以外其餘所有數字的乘積,而且不能使用除法
解題思路:先算一個前綴乘積v,v[i]代表從0到i所有數字乘起來的結果;再算一個後綴乘積v1,是從陣列尾端往前乘;最後每個位置的答案就是它左邊的前綴乘積乘上右邊的後綴乘積,頭尾兩個位置因為沒有左邊或右邊,所以當作1來處理

class Solution {
public:
    vector<int> productExceptSelf(vector<int>& nums) {
        int n = nums.size();
        vector<int> v, v1, ans;

        v.push_back(nums[0]);
        for (int i = 1; i < n; i++) {
            v.push_back(v[i-1] * nums[i]);
        }

        v1.push_back(nums[n-1]);
        for (int i = n-2, j = 0; i > 0; i--, j++) {
            v1.push_back(v1[j] * nums[i]);
        }

        for (int i = 0; i < n; i++) {
            int left  = (i == 0) ? 1 : v[i-1];
            int right = (i == n-1) ? 1 : v1[n-2-i];
            ans.push_back(left * right);
        }
        return ans;
    }
};

https://ithelp.ithome.com.tw/upload/images/20260917/20184265mhZ9ujqoEO.png

題目解析:判斷一個陣列裡面是否存在三個遞增的數字(不用連續,只要順序上遞增即可),有的話回傳true,沒有就回傳false
解題思路:設兩個變數a跟b,分別用來記錄目前看過最小跟第二小的數字,遍歷陣列時如果遇到比a小的就更新a,比a大但比b小的就更新b,如果遇到比a跟b都大的數字,代表已經湊齊三個遞增的數字了,直接回傳true,跑完迴圈都沒找到就回傳false

class Solution {
public:
    bool increasingTriplet(vector<int>& nums) {
        int a = INT_MAX, b = INT_MAX;

        for(int i=0; i<nums.size(); i++){
            if(a >= nums[i]) a = nums[i];
            else if(b >= nums[i]) b = nums[i];
            else return 1;
        }

        return 0;
    }
};

https://ithelp.ithome.com.tw/upload/images/20260917/20184265SP5oKXR9I1.png

題目解析:現在有一個字元陣列chars,要求把連續重複出現的字元原地壓縮成「字元+出現次數」的形式(如果只出現1次就不用寫數字),並回傳壓縮後的長度
解題思路:先用n計算目前這個字元連續出現了幾次,當遇到跟前一個不一樣的字元時,就把字元跟次數(次數大於1才需要寫)塞進新的vector v裡面,然後重新從n=1開始算下一個字元,迴圈跑完後別忘了把最後一組字元跟次數也塞進去,最後把chars換成v,回傳v的長度

class Solution {
public:
    int compress(vector<char>& chars) {
        vector<char> v;
        char c = chars[0];
        int n = 1;

        for(int i=1; i<chars.size(); i++){
            if(c != chars[i]){
                v.push_back(c);
                string s = to_string(n);
                if(n != 1){
                    for(int i=0; i<s.size(); i++){
                        v.push_back(s[i]);
                    }
                }
                n = 1;
                c = chars[i];
            }else{
                n++;
            }
        }

        v.push_back(c);
        string s = to_string(n);
        if(n != 1){
            for(int i=0; i<s.size(); i++){
                v.push_back(s[i]);
            }
        }
        chars = v;
        return v.size();
    }
};

上一篇
C++ 演算法練習 Day2|605,345,151 題解與思路分享
下一篇
C++ 演算法練習 Day4|283, 392, 11 題解與思路分享
系列文
30天刷完leetcoode756
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言